/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package edu.capex.farmacus.controllers;

import edu.capex.farmacus.controllers.exceptions.NonexistentEntityException;
import edu.capex.farmacus.controllers.exceptions.PreexistingEntityException;
import edu.capex.farmacus.encapsulates.Autenticacion;
import java.io.Serializable;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import edu.capex.farmacus.encapsulates.Visitadores;
import edu.capex.farmacus.encapsulates.Vendedores;
import edu.capex.farmacus.encapsulates.Supervisores;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;

/**
 *
 * @author IK
 */
public class AutenticacionJpaController implements Serializable {

    public AutenticacionJpaController(EntityManagerFactory emf) {
        this.emf = emf;
    }
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(Autenticacion autenticacion) throws PreexistingEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Visitadores idVisitador = autenticacion.getIdVisitador();
            if (idVisitador != null) {
                idVisitador = em.getReference(idVisitador.getClass(), idVisitador.getId());
                autenticacion.setIdVisitador(idVisitador);
            }
            Vendedores idVendedor = autenticacion.getIdVendedor();
            if (idVendedor != null) {
                idVendedor = em.getReference(idVendedor.getClass(), idVendedor.getId());
                autenticacion.setIdVendedor(idVendedor);
            }
            Supervisores idSupervisor = autenticacion.getIdSupervisor();
            if (idSupervisor != null) {
                idSupervisor = em.getReference(idSupervisor.getClass(), idSupervisor.getIdsupervisores());
                autenticacion.setIdSupervisor(idSupervisor);
            }
            em.persist(autenticacion);
            if (idVisitador != null) {
                idVisitador.getAutenticacionList().add(autenticacion);
                idVisitador = em.merge(idVisitador);
            }
            if (idVendedor != null) {
                idVendedor.getAutenticacionList().add(autenticacion);
                idVendedor = em.merge(idVendedor);
            }
            if (idSupervisor != null) {
                idSupervisor.getAutenticacionList().add(autenticacion);
                idSupervisor = em.merge(idSupervisor);
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            if (findAutenticacion(autenticacion.getUsuario()) != null) {
                throw new PreexistingEntityException("Autenticacion " + autenticacion + " already exists.", ex);
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(Autenticacion autenticacion) throws NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Autenticacion persistentAutenticacion = em.find(Autenticacion.class, autenticacion.getUsuario());
            Visitadores idVisitadorOld = persistentAutenticacion.getIdVisitador();
            Visitadores idVisitadorNew = autenticacion.getIdVisitador();
            Vendedores idVendedorOld = persistentAutenticacion.getIdVendedor();
            Vendedores idVendedorNew = autenticacion.getIdVendedor();
            Supervisores idSupervisorOld = persistentAutenticacion.getIdSupervisor();
            Supervisores idSupervisorNew = autenticacion.getIdSupervisor();
            if (idVisitadorNew != null) {
                idVisitadorNew = em.getReference(idVisitadorNew.getClass(), idVisitadorNew.getId());
                autenticacion.setIdVisitador(idVisitadorNew);
            }
            if (idVendedorNew != null) {
                idVendedorNew = em.getReference(idVendedorNew.getClass(), idVendedorNew.getId());
                autenticacion.setIdVendedor(idVendedorNew);
            }
            if (idSupervisorNew != null) {
                idSupervisorNew = em.getReference(idSupervisorNew.getClass(), idSupervisorNew.getIdsupervisores());
                autenticacion.setIdSupervisor(idSupervisorNew);
            }
            autenticacion = em.merge(autenticacion);
            if (idVisitadorOld != null && !idVisitadorOld.equals(idVisitadorNew)) {
                idVisitadorOld.getAutenticacionList().remove(autenticacion);
                idVisitadorOld = em.merge(idVisitadorOld);
            }
            if (idVisitadorNew != null && !idVisitadorNew.equals(idVisitadorOld)) {
                idVisitadorNew.getAutenticacionList().add(autenticacion);
                idVisitadorNew = em.merge(idVisitadorNew);
            }
            if (idVendedorOld != null && !idVendedorOld.equals(idVendedorNew)) {
                idVendedorOld.getAutenticacionList().remove(autenticacion);
                idVendedorOld = em.merge(idVendedorOld);
            }
            if (idVendedorNew != null && !idVendedorNew.equals(idVendedorOld)) {
                idVendedorNew.getAutenticacionList().add(autenticacion);
                idVendedorNew = em.merge(idVendedorNew);
            }
            if (idSupervisorOld != null && !idSupervisorOld.equals(idSupervisorNew)) {
                idSupervisorOld.getAutenticacionList().remove(autenticacion);
                idSupervisorOld = em.merge(idSupervisorOld);
            }
            if (idSupervisorNew != null && !idSupervisorNew.equals(idSupervisorOld)) {
                idSupervisorNew.getAutenticacionList().add(autenticacion);
                idSupervisorNew = em.merge(idSupervisorNew);
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                String id = autenticacion.getUsuario();
                if (findAutenticacion(id) == null) {
                    throw new NonexistentEntityException("The autenticacion with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(String id) throws NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Autenticacion autenticacion;
            try {
                autenticacion = em.getReference(Autenticacion.class, id);
                autenticacion.getUsuario();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The autenticacion with id " + id + " no longer exists.", enfe);
            }
            Visitadores idVisitador = autenticacion.getIdVisitador();
            if (idVisitador != null) {
                idVisitador.getAutenticacionList().remove(autenticacion);
                idVisitador = em.merge(idVisitador);
            }
            Vendedores idVendedor = autenticacion.getIdVendedor();
            if (idVendedor != null) {
                idVendedor.getAutenticacionList().remove(autenticacion);
                idVendedor = em.merge(idVendedor);
            }
            Supervisores idSupervisor = autenticacion.getIdSupervisor();
            if (idSupervisor != null) {
                idSupervisor.getAutenticacionList().remove(autenticacion);
                idSupervisor = em.merge(idSupervisor);
            }
            em.remove(autenticacion);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<Autenticacion> findAutenticacionEntities() {
        return findAutenticacionEntities(true, -1, -1);
    }

    public List<Autenticacion> findAutenticacionEntities(int maxResults, int firstResult) {
        return findAutenticacionEntities(false, maxResults, firstResult);
    }

    private List<Autenticacion> findAutenticacionEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(Autenticacion.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public Autenticacion findAutenticacion(String id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(Autenticacion.class, id);
        } finally {
            em.close();
        }
    }

    public int getAutenticacionCount() {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            Root<Autenticacion> rt = cq.from(Autenticacion.class);
            cq.select(em.getCriteriaBuilder().count(rt));
            Query q = em.createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }
    
}
